package com.atguigu.gulimall.seckill;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/**
 * 1、整合sentinel
 *      1)、导入依赖 spring-cloud-starter-alibaba-sentinel
 *       2）、下载sentinel控制台
 *       3）、配置sentinel控制台地址信息(多个模块使用相同)
 *              spring.cloud.sentinel.transport.port=8719
                spring.cloud.sentinel.transport.dashboard=127.0.0.1:8333
                feign.sentinel.enabled=true
          4）、在控制台调整参数【默认所有的流控设置在内存中，重启失效】 或者  @SentinelResource(value = "sayHello")注解定义

  2、每一个服务都导入 spring-boot-starter-actuator ，实时监控,并配置：management.endpoints.web.exposure.include=*
  3、自定义sentinel流控数据返回
  4、使用sentinel来保护feign的远程调用：熔断
    1)、调用方的熔断保护  feign.sentinel.enabled=true
    2）、调用方手动指定远程服务的降级策略  远程服务被降级处理，触发我们的熔断回调方法
    3）、超大流量的时候必须牺牲一些远程服务。在服务的提供方（远程服务）指定降级策略
        提供方式在运行，但是不运行自己的逻辑，返回的是默认的熔断数据（限流的数据）
  5、自定义受保护的资源
        1)、 try (Entry entry= SphU.entry("seckillSkus")){业务逻辑}catch(Exception e){}
        2)、基于注解  @SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
            无论是1还是2，一定要配置被限流以后的返回，url请求可以设置统一返回 WebCallbackManager

  6、网关流控
    1、依赖 spring-cloud-alibaba-sentinel-gateway
    2、自定义返回配置 SentinelGatewayConfig 和其他的模块的配置不同，基于响应式编程

 */
//@EnableRabbit   //这个注解不监听的时候可以不加
@EnableRedisHttpSession
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallSeckillApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallSeckillApplication.class, args);
    }

}
